package com.xr.blog.tools.constant;

/**
 * description : 状态码
 *
 * @author 幸仁杰
 * @create 2020/6/24 15:47
 */
public class Code {
    /*--------------------------------通用常量--------------------------------------*/

    /**
     * 验证码 redis key
     */
    public static final String CAPTCHA_CODE_KEY = "captcha_codes:";

    /**
     * 验证码有效期（分钟）
     */
    public static final Integer CAPTCHA_EXPIRATION = 3;

    /**
     * 令牌
     */
    public static final String TOKEN = "token";

    /**
     * 令牌前缀
     */
    public static final String TOKEN_PREFIX = "Bearer ";

    /**
     * 令牌前缀
     */
    public static final String LOGIN_USER_KEY = "login_user_key";


    /**
     * 登录用户 redis key
     */
    public static final String LOGIN_TOKEN_KEY = "login_tokens:";


    /**
     * 登录失败
     */
    public static final String LOGIN_FAIL = "Error";

    /**
     * 登录成功
     */
    public static final String LOGIN_SUCCESS = "Success";

    /**
     * 注销
     */
    public static final String LOGOUT = "Logout";

    /**
     * UTF-8 字符集
     */
    public static final String UTF8 = "UTF-8";

    /**
     * GBK 字符集
     */
    public static final String GBK = "GBK";

    /**
     * 评论是否需要校检之后才显示
     */
    public final static String COMMENT_CHECK = "COMMENT_CHECK";

    /**
     * 文件上传异常
     */
    public final static Integer UPLOAD_ERROR = 40006;


    /**
     * 存储配置KEY
     */
    public final static String FILE_STORAGE = "FILE_STORAGE";

    /**
     * 存储类型（七牛云）
     */
    public static final Integer QINIU = 1;

    /**
     * 存储类型（阿里云）
     */
    public static final Integer ALIYUN = 2;

    /**
     * 存储类型（腾讯云）
     */
    public static final Integer QCLOUD = 3;

    /**
     * 存储类型（本地）
     */
    public static final Integer LOCAL = 4;


    /**
     * 网站域名
     */
    public final static String DOMIN = "BLOG_URL";


    /**
     * 压缩阈值，超过此大小的图片将被压缩，此处是512kb
     */
    public static final long COMPRESSION_SIZE=524288L;


    /*--------------------------------信息，服务器收到请求，需要请求者继续执行操作--------------------------------------*/

    /**
     * 客户端应继续其请求
     */
    public static final Code SC_CONTINUE = new Code(100, "继续");

    /**
     * 服务器根据客户端的请求切换协议。只能切换到更高级的协议，例如，切换到HTTP的新版本协议
     */
    public static final Code SC_SWITCHING_PROTOCOLS = new Code(101, "切换协议");

    /*-------------------------------------------成功，操作被成功接收并处理--------------------------------------------*/

    /**
     * 一般用于GET与POST请求
     */
    public static final Code SC_OK = new Code(200, "请求成功");

    /**
     * 成功请求并创建了新的资源
     */
    public static final Code SC_CREATED = new Code(201, "新建或者修改数据成功");

    /**
     * 已经接受请求，但未处理完成
     */
    public static final Code SC_ACCEPTED = new Code(202, "已接受");

    /**
     * 请求成功。但返回的meta信息不在原始的服务器，而是一个副本
     */
    public static final Code SC_NON_AUTHORITATIVE_INFORMATION = new Code(203, "非授权信息");

    /**
     * 服务器成功处理，但未返回内容。在未更新网页的情况下，可确保浏览器继续显示当前文档
     */
    public static final Code SC_NO_CONTENT = new Code(204, "无返回内容,删除数据成功");

    /**
     * 服务器处理成功，用户终端（例如：浏览器）应重置文档视图。可通过此返回码清除浏览器的表单域
     */
    public static final Code SC_RESET_CONTENT = new Code(205, "重置内容");

    /**
     * 服务器成功处理了部分GET请求
     */
    public static final Code SC_PARTIAL_CONTENT = new Code(206, "部分内容");

    /*---------------------------------------重定向，需要进一步的操作以完成请求----------------------------------------*/

    /**
     * 请求的资源可包括多个位置，相应可返回一个资源特征与地址的列表用于用户终端（例如：浏览器）选择
     */
    public static final Code SC_MULTIPLE_CHOICES = new Code(300, "多种选择");

    /**
     * 请求的资源已被永久的移动到新URI，返回信息会包括新的URI，浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
     */
    public static final Code SC_MOVED_PERMANENTLY = new Code(301, "永久移动");

    /**
     * 与301类似。但资源只是临时被移动。客户端应继续使用原有URI
     */
    public static final Code SC_MOVED_TEMPORARILY = new Code(302, "临时移动");

    /**
     * 与301类似。但资源只是临时被移动。客户端应继续使用原有URI
     */
    public static final Code SC_FOUND = new Code(302, "临时移动");

    /**
     * 查看其它地址
     */
    public static final Code SC_SEE_OTHER = new Code(303, "查看其它地址");

    /**
     * 所请求的资源未修改，服务器返回此状态码时，不会返回任何资源。客户端通常会缓存访问过的资源，通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
     */
    public static final Code SC_NOT_MODIFIED = new Code(304, "未修改");

    /**
     * 所请求的资源必须通过代理访问
     */
    public static final Code SC_USE_PROXY = new Code(305, "使用代理");

    /**
     * 与302类似。使用GET请求重定向
     */
    public static final Code SC_TEMPORARY_REDIRECT = new Code(307, "临时重定向");

    /*-----------------------------------客户端错误，请求包含语法错误或无法完成请求-------------------------------------*/
    /**
     * 服务器无法理解
     */
    public static final Code SC_BAD_REQUEST = new Code(400, "客户端请求的语法错误");

    /**
     * 请求要求用户的身份认证
     */
    public static final Code SC_UNAUTHORIZED = new Code(401, "请求要求用户的身份认证");

    /**
     * 保留，将来使用
     */
    public static final Code SC_PAYMENT_REQUIRED = new Code(402, "保留");

    /**
     * 服务器理解请求客户端的请求，但是拒绝执行此请求
     */
    public static final Code SC_FORBIDDEN = new Code(403, "拒绝执行此请求");

    /**
     * 服务器无法根据客户端的请求找到资源（网页）。通过此代码，网站设计人员可设置"您所请求的资源无法找到"的个性页面
     */
    public static final Code SC_NOT_FOUND = new Code(404, "未找到请求资源");

    /**
     * 客户端请求中的方法被禁止
     */
    public static final Code SC_METHOD_NOT_ALLOWED = new Code(405, "客户端请求中的方法被禁止");

    /**
     * 服务器无法根据客户端请求的内容特性完成请求
     */
    public static final Code SC_NOT_ACCEPTABLE = new Code(406, "服务器无法根据客户端请求的内容特性完成请求");

    /**
     * 请求要求代理的身份认证，与401类似，但请求者应当使用代理进行授权
     */
    public static final Code SC_PROXY_AUTHENTICATION_REQUIRED = new Code(407, "请求要求代理的身份认证");

    /**
     * 服务器等待客户端发送的请求时间过长，超时
     */
    public static final Code SC_REQUEST_TIMEOUT = new Code(408, "请求超时");

    /**
     * 服务器完成客户端的PUT请求是可能返回此代码，服务器处理请求时发生了冲突,如PC端与移动端同时修改个人信息.
     */
    public static final Code SC_CONFLICT = new Code(409, "处理请求时发生了冲突");

    /**
     * 客户端请求的资源已经不存在。410不同于404，如果资源以前有现在被永久删除了可使用410代码，网站设计人员可通过301代码指定资源的新位置
     */
    public static final Code SC_GONE = new Code(410, "客户端请求的资源已经不存在");

    /**
     * 服务器无法处理客户端发送的不带Content-Length的请求信息
     */
    public static final Code SC_LENGTH_REQUIRED = new Code(411, "请求信息没带Content-Length");

    /**
     * 客户端请求信息的先决条件错误
     */
    public static final Code SC_PRECONDITION_FAILED = new Code(412, "客户端请求信息的先决条件错误");

    /**
     * 由于请求的实体过大，服务器无法处理，因此拒绝请求。为防止客户端的连续请求，服务器可能会关闭连接。如果只是服务器暂时无法处理，则会包含一个Retry-After的响应信息
     */
    public static final Code SC_REQUEST_ENTITY_TOO_LARGE = new Code(413, "请求的实体过大,拒绝请求");

    /**
     * 请求的URI过长（URI通常为网址），服务器无法处理
     */
    public static final Code SC_REQUEST_URI_TOO_LONG = new Code(414, "请求的URI过长,服务器无法处理");

    /**
     * 服务器无法处理请求附带的媒体格式
     */
    public static final Code SC_UNSUPPORTED_MEDIA_TYPE = new Code(415, "服务器无法处理请求附带的媒体格式");

    /**
     * 客户端请求的范围无效
     */
    public static final Code SC_REQUESTED_RANGE_NOT_SATISFIABLE = new Code(416, "客户端请求的范围无效");

    /**
     * 服务器无法满足Expect的请求头信息
     */
    public static final Code SC_EXPECTATION_FAILED = new Code(417, "服务器无法满足Expect的请求头信息");

    /*---------------------------------服务器错误，服务器在处理请求的过程中发生了错误-----------------------------------*/

    /**
     * 服务器内部错误，无法完成请求
     */
    public static final Code SC_INTERNAL_SERVER_ERROR = new Code(500, "服务器内部错误，无法完成请求");

    /**
     * 服务器不支持请求的功能，无法完成请求
     */
    public static final Code SC_NOT_IMPLEMENTED = new Code(501, "服务器不支持请求的功能，无法完成请求");

    /**
     * 充当网关或代理的服务器，从远端服务器接收到了一个无效的请求
     */
    public static final Code SC_BAD_GATEWAY = new Code(502, "充当网关或代理的服务器，从远端服务器接收到了一个无效的请求");

    /**
     * 由于超载或系统维护，服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
     */
    public static final Code SC_SERVICE_UNAVAILABLE = new Code(503, "由于超载或系统维护，服务器暂时的无法处理客户端的请求");

    /**
     * 充当网关或代理的服务器，未及时从远端服务器获取请求
     */
    public static final Code SC_GATEWAY_TIMEOUT = new Code(504, "充当网关或代理的服务器，未及时从远端服务器获取请求");

    /**
     * 服务器不支持请求的HTTP协议的版本，无法完成处理
     */
    public static final Code SC_HTTP_VERSION_NOT_SUPPORTED = new Code(505, "服务器不支持请求的HTTP协议的版本");


    /*---------------------------------------------自定义业务码-------------------------------------------------------*/
    public static final Code OTHER = new Code(-2, "");
    public static final Code ERROR = new Code(-1, "系统错误");
    public static final Code SUCCESS = new Code(200, "成功");
    public static final Code NO_DATA = new Code(210, "暂无数据");
    public static final Code CODE_LOGIN = new Code(1003, "请登录");
    public static final Code PARAM_NEED = new Code(1006, "缺少必填参数");
    public static final Code DEL_FAIL = new Code(1005, "数据删除失败");
    public static final Code NO_DEL_DATA = new Code(1007, "没有找到被删除数据");
    public static final Code NO_TOKEN = new Code(211, "token为空");
    public static final Code LOGIN_ERROR = new Code(212, "登录失败");
    public static final Code VAILDATE_ERROR = new Code(1001, "数据验证错误");
    public static final Code RPC_ERROR = new Code(1002, "远程调用异常");
    public static final Code NO_IP = new Code(1002, "IP不允许访问");
    public static final Code JOIN_MORE = new Code(1003, "查询关联表过多");
    public static final Code SQL_ERROR = new Code(1005, "sql异常");
    public static final Code TYPE_CONVERSION_EXCEPTION = new Code(1004, "类型转换异常");
    public static final Code TOKEN_ERROR = new Code(1006, "token错误");
    public static final Code TOKEN_EXP = new Code(1006, "token过期");
    public static final Code PASSWORD_ERROR = new Code(1007, "账号或密码错误");
    public static final Code MENUID_ERROR = new Code(2001, "根菜单不允许删除");
    public static final Code MENUPARETN_ERROR = new Code(2002, "该菜单下有子菜单不允许删除");
    public static final Code MENUPARETNORSUNID_ERROR = new Code(2003, "不允许将根菜单该为子菜单");
    public static final Code MENUROTE_ERROR = new Code(2000, "菜单路由重复");
    public static final Code TOKEN_DELETE = new Code(1008, "TOKEN已经被删除");
    public static final Code HTTP_ERROR = new Code(1010, "HTTP远程调用异常");
    public static final Code MUNEID_EOOR = new Code(2004, "菜单id不能为空");
    public static final Code MENULIST_ERROR = new Code(2003, "没有查到菜单");
    public static final Code MENUPARENTNAME_EOOR = new Code(2008, "菜单名不能相同");
    public static final Code MUNEINSERTTOID_EOOR = new Code(2006, "保存失败");
    public static final Code CONNECT_ERROR = new Code(2009, "连接推送服务出错");
    public static final Code CONNECT_SUCCESS = new Code(200, "连接推送服务成功");
    public static final Code NO_SESSION = new Code(2010, "无客户端连接");

    private final int state;
    private String description;

    public Code(int state, String description) {
        this.state = state;
        this.description = description;
    }

    public int getState() {
        return state;
    }

    public String getDescription() {
        return description;
    }

    public Code setDescription(String description) {
        this.description = description;
        return this;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("{");
        sb.append("\"state\":")
                .append(state);
        sb.append(",\"description\":\"")
                .append(description).append('\"');
        sb.append('}');
        return sb.toString();
    }
}
